题面

解题思路

这是一道用 priority_queue 显然可做的题,然而明明可以反着做,我却一定要正序做……

深深地明白自己的弱小……

Code

#include<bits/stdc++.h>
#define rgt register
#define rint rgt int
#define LL long long
#define rll rgt LL
#define inf 0x7f7f7f7f
#define N 200007
using namespace std;
template<class K>inline bool cmax(K&a,const K&b){return(a<b)?a=b,1:0;}
template<class K>inline bool cmin(K&a,const K&b){return(a>b)?a=b,1:0;}
inline int read() {
rint s=0;
rgt char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) s=(s<<1)+(s<<3)+c-'0',c=getchar();
return s;
}
struct node{
int sco,rew;
inline void in() {
sco=read(),rew=read();
}
inline bool operator< (const node x) const{
return sco<x.sco;
}
}b[N];
int n,m,ans=-1;
LL sum,res,f[N];
priority_queue<int>pl,pr;
int main()
{
rint i,k,c;
k=(read()-1)>>1,n=read(),m=read();
for(i=1;i<=n;i++) b[i].in();
if(!k) {
for(i=1;i<=n;i++)
if(b[i].rew<=m)
cmax(ans,b[i].sco);
printf("%d",ans);return 0;
}sort(b+1,b+n+1);
for(i=n-k+1;i<=n;i++) res+=b[i].rew,pr.push(b[i].rew);
for(i=n-k;i>k;--i) {
f[i]=res;//只不过正序做就不用记录,不知道为什么感觉反着做有点投机取巧……
if(pr.top()>b[i].rew)
res=res-pr.top()+b[i].rew,
pr.pop(),pr.push(b[i].rew);
}
for(i=1;i<=k;i++) sum+=b[i].rew,pl.push(b[i].rew);
for(i=k+1;i<=n-k;i++) {
if(sum+b[i].rew+f[i]<=m) ans=b[i].sco;
if(pl.top()>b[i].rew)
sum=sum-pl.top()+b[i].rew,
pl.pop(),pl.push(b[i].rew);
}printf("%d\n",ans);
return 0;
}

devil.